#ifndef WEBINTERFACE_H
#define WEBINTERFACE_H
#include <QObject>

QT_BEGIN_NAMESPACE
class QWebEnginePage;
QT_END_NAMESPACE

class WebInterface : public QObject
{
    Q_OBJECT

public:
    explicit WebInterface(QWebEnginePage* page, QObject* parent = nullptr);

    QWebEnginePage* page() const { return page_; }

    // 回调js方法
    virtual bool invokeJsCallback(const QString& object_id, const QString& callback,
                                  const QString& args, bool keep = false) = 0;
    // 通知客户端事件
    virtual void notifyClientEvent(const QString& event_name, const QString& args) = 0;

    // 调用js方法
    virtual void invokeJsMethod(const QString& object_id, const QString& method,
                                const QString& args, const QString& success_callback,
                                const QString& failure_callback, const QString& sender_id) = 0;

private:
    QWebEnginePage* page_;
};

class ClientWebInterface : public WebInterface
{
    Q_OBJECT

public:
    explicit ClientWebInterface(QWebEnginePage* page, QObject* parent = nullptr);

    // 回调js方法
    bool invokeJsCallback(const QString& object_id, const QString& callback, const QString& args,
                          bool keep = false) override;
    // 通知客户端事件
    void notifyClientEvent(const QString& event_name, const QString& args) override;

    // 调用js方法
    void invokeJsMethod(const QString& object_id, const QString& method, const QString& args,
                        const QString& success_callback, const QString& failure_callback,
                        const QString& sender_id) override;
};

class MobileWebInterface : public WebInterface
{
    Q_OBJECT

public:
    explicit MobileWebInterface(QWebEnginePage* page, QObject* parent = nullptr);

    // 回调js方法
    bool invokeJsCallback(const QString& object_id, const QString& callback, const QString& args,
                          bool keep = false) override;
    // 通知客户端事件
    void notifyClientEvent(const QString& event_name, const QString& args) override;

    // 调用js方法
    void invokeJsMethod(const QString& object_id, const QString& method, const QString& args,
                        const QString& success_callback, const QString& failure_callback,
                        const QString& sender_id) override;
};

#endif // WEBINTERFACE_H
